implement Limbo;

#line	2	"limbo.y"
include "limbo.m";
include "draw.m";

Limbo: module {

	init:		fn(ctxt: ref Draw->Context, argv: list of string);

	YYSTYPE: adt{
		tok:	Tok;
		ids:	ref Decl;
		node:	ref Node;
		ty:	ref Type;
		types:	ref Typelist;
	};

	YYLEX: adt {
		lval: YYSTYPE;
		lex: fn(nil: self ref YYLEX): int;
		error: fn(nil: self ref YYLEX, err: string);
	};
Landeq: con	57346;
Loreq: con	57347;
Lxoreq: con	57348;
Llsheq: con	57349;
Lrsheq: con	57350;
Laddeq: con	57351;
Lsubeq: con	57352;
Lmuleq: con	57353;
Ldiveq: con	57354;
Lmodeq: con	57355;
Lexpeq: con	57356;
Ldeclas: con	57357;
Lload: con	57358;
Loror: con	57359;
Landand: con	57360;
Lcons: con	57361;
Leq: con	57362;
Lneq: con	57363;
Lleq: con	57364;
Lgeq: con	57365;
Llsh: con	57366;
Lrsh: con	57367;
Lexp: con	57368;
Lcomm: con	57369;
Linc: con	57370;
Ldec: con	57371;
Lof: con	57372;
Lref: con	57373;
Lif: con	57374;
Lelse: con	57375;
Lfn: con	57376;
Lexcept: con	57377;
Lraises: con	57378;
Lmdot: con	57379;
Lto: con	57380;
Lor: con	57381;
Lrconst: con	57382;
Lconst: con	57383;
Lid: con	57384;
Ltid: con	57385;
Lsconst: con	57386;
Llabs: con	57387;
Lnil: con	57388;
Llen: con	57389;
Lhd: con	57390;
Ltl: con	57391;
Ltagof: con	57392;
Limplement: con	57393;
Limport: con	57394;
Linclude: con	57395;
Lcon: con	57396;
Ltype: con	57397;
Lmodule: con	57398;
Lcyclic: con	57399;
Ladt: con	57400;
Larray: con	57401;
Llist: con	57402;
Lchan: con	57403;
Lself: con	57404;
Ldo: con	57405;
Lwhile: con	57406;
Lfor: con	57407;
Lbreak: con	57408;
Lalt: con	57409;
Lcase: con	57410;
Lpick: con	57411;
Lcont: con	57412;
Lreturn: con	57413;
Lexit: con	57414;
Lspawn: con	57415;
Lraise: con	57416;
Lfix: con	57417;
Ldynamic: con	57418;

};

#line	27	"limbo.y"
	#
	# lex.b
	#
	signdump:	string;			# name of function for sig debugging
	superwarn:	int;
	debug:		array of int;
	noline:		Line;
	nosrc:		Src;
	arrayz:		int;
	oldcycles:	int;
	emitcode:	string;			# emit stub routines for system module functions
	emitdyn: int;				# emit as above but for dynamic modules
	emitsbl:	string;			# emit symbol file for sysm modules
	emitstub:	int;			# emit type and call frames for system modules
	emittab:	string;			# emit table of runtime functions for this module
	errors:		int;
	mustcompile:	int;
	dontcompile:	int;
	asmsym:		int;			# generate symbols in assembly language?
	bout:		ref Bufio->Iobuf;	# output file
	bsym:		ref Bufio->Iobuf;	# symbol output file; nil => no sym out
	gendis:		int;			# generate dis or asm?
	fixss:		int;
	newfnptr:	int;		# ISELF and -ve indices
	optims: int;

	#
	# decls.b
	#
	scope:		int;
	# impmod:		ref Sym;		# name of implementation module
	impmods:		ref Decl;		# name of implementation module(s)
	nildecl:	ref Decl;		# declaration for limbo's nil
	selfdecl:	ref Decl;		# declaration for limbo's self

	#
	# types.b
	#
	tany:		ref Type;
	tbig:		ref Type;
	tbyte:		ref Type;
	terror:		ref Type;
	tint:		ref Type;
	tnone:		ref Type;
	treal:		ref Type;
	tstring:	ref Type;
	texception:	ref Type;
	tunknown:	ref Type;
	tfnptr:	ref Type;
	rtexception:	ref Type;
	descriptors:	ref Desc;		# list of all possible descriptors
	tattr:		array of Tattr;

	#
	# nodes.b
	#
	opcommute:	array of int;
	oprelinvert:	array of int;
	isused:		array of int;
	casttab:	array of array of int;	# instruction to cast from [1] to [2]

	nfns:		int;			# functions defined
	nfnexp:		int;
	fns:		array of ref Decl;	# decls for fns defined
	tree:		ref Node;		# root of parse tree

	parset:		int;			# time to parse
	checkt:		int;			# time to typecheck
	gent:		int;			# time to generate code
	writet:		int;			# time to write out code
	symt:		int;			# time to write out symbols
YYEOFCODE: con 1;
YYERRCODE: con 2;
YYMAXDEPTH: con 200;

#line	1636	"limbo.y"


include "ipints.m";
include "crypt.m";

sys:	Sys;
	print, fprint, sprint: import sys;

bufio:	Bufio;
	Iobuf: import bufio;

str:		String;

crypt:Crypt;
	md5: import crypt;

math:	Math;
	import_real, export_real, isnan: import math;

yyctxt: ref YYLEX;

canonnan: real;

debug	= array[256] of {* => 0};

noline	= -1;
nosrc	= Src(-1, -1);

infile:	string;

# front end
include "arg.m";
include "lex.b";
include "types.b";
include "nodes.b";
include "decls.b";

include "typecheck.b";

# back end
include "gen.b";
include "ecom.b";
include "asm.b";
include "dis.b";
include "sbl.b";
include "stubs.b";
include "com.b";
include "optim.b";

init(nil: ref Draw->Context, argv: list of string)
{
	s: string;

	sys = load Sys Sys->PATH;
	crypt = load Crypt Crypt->PATH;
	math = load Math Math->PATH;
	bufio = load Bufio Bufio->PATH;
	if(bufio == nil){
		sys->print("can't load %s: %r\n", Bufio->PATH);
		raise("fail:bad module");
	}
	str = load String String->PATH;
	if(str == nil){
		sys->print("can't load %s: %r\n", String->PATH);
		raise("fail:bad module");
	}

	stderr = sys->fildes(2);
	yyctxt = ref YYLEX;

	math->FPcontrol(0, Math->INVAL|Math->ZDIV|Math->OVFL|Math->UNFL|Math->INEX);
	na := array[1] of {0.};
	import_real(array[8] of {byte 16r7f, * => byte 16rff}, na);
	canonnan = na[0];
	if(!isnan(canonnan))
		fatal("bad canonical NaN");

	lexinit();
	typeinit();
	optabinit();

	gendis = 1;
	asmsym = 0;
	maxerr = 20;
	ofile := "";
	ext := "";

	arg := Arg.init(argv);
	while(c := arg.opt()){
		case c{
		'Y' =>
			emitsbl = arg.arg();
			if(emitsbl == nil)
				usage();
		'C' =>
			dontcompile = 1;
		'D' =>
			#
			# debug flags:
			#
			# a	alt compilation
			# A	array constructor compilation
			# b	boolean and branch compilation
			# c	case compilation
			# d	function declaration
			# D	descriptor generation
			# e	expression compilation
			# E	addressable expression compilation
			# f	print arguments for compiled functions
			# F	constant folding
			# g	print out globals
			# m	module declaration and type checking
			# n	nil references
			# s	print sizes of output file sections
			# S	type signing
			# t	type checking function bodies
			# T	timing
			# v	global var and constant compilation
			# x	adt verification
			# Y	tuple compilation
			# z Z	bug fixes
			#
			s = arg.arg();
			for(i := 0; i < len s; i++){
				c = s[i];
				if(c < len debug)
					debug[c] = 1;
			}
		'I' =>
			s = arg.arg();
			if(s == "")
				usage();
			addinclude(s);
		'G' =>
			asmsym = 1;
		'S' =>
			gendis = 0;
		'a' =>
			emitstub = 1;
		'A' =>
			emitstub = emitdyn = 1;
		'c' =>
			mustcompile = 1;
		'e' =>
			maxerr = 1000;
		'f' =>
			fabort = 1;
		'F' =>
			newfnptr = 1;
		'g' =>
			dosym = 1;
		'i' =>
			dontinline = 1;
		'o' =>
			ofile = arg.arg();
		'O' =>
			optims = 1;
		's' =>
			s = arg.arg();
			if(s != nil)
				fixss = int s;
		't' =>
			emittab = arg.arg();
			if(emittab == nil)
				usage();
		'T' =>
			emitcode = arg.arg();
			if(emitcode == nil)
				usage();
		'd' =>
			emitcode = arg.arg();
			if(emitcode == nil)
				usage();
			emitdyn = 1;
		'w' =>
			superwarn = dowarn;
			dowarn = 1;
		'x' =>
			ext = arg.arg();
		'X' =>
			signdump = arg.arg();
		'z' =>
			arrayz = 1;
		'y' =>
			oldcycles = 1;
		* =>
			usage();
		}
	}

	addinclude("/module");

	argv = arg.argv;
	arg = nil;

	if(argv == nil){
		usage();
	}else if(ofile != nil){
		if(len argv != 1)
			usage();
		translate(hd argv, ofile, mkfileext(ofile, ".dis", ".sbl"));
	}else{
		pr := len argv != 1;
		if(ext == ""){
			ext = ".s";
			if(gendis)
				ext = ".dis";
		}
		for(; argv != nil; argv = tl argv){
			file := hd argv;
			(nil, s) = str->splitr(file, "/");
			if(pr)
				print("%s:\n", s);
			out := mkfileext(s, ".b", ext);
			translate(file, out, mkfileext(out, ext, ".sbl"));
		}
	}
	if (toterrors > 0)
		raise("fail:errors");
}

usage()
{
	fprint(stderr, "usage: limbo [-GSagwe] [-I incdir] [-o outfile] [-{T|t|d} module] [-D debug] file ...\n");
	raise("fail:usage");
}

mkfileext(file, oldext, ext: string): string
{
	n := len file;
	n2 := len oldext;
	if(n >= n2 && file[n-n2:] == oldext)
		file = file[:n-n2];
	return file + ext;
}

translate(in, out, dbg: string)
{
	infile = in;
	outfile = out;
	errors = 0;
	bins[0] = bufio->open(in, Bufio->OREAD);
	if(bins[0] == nil){
		fprint(stderr, "can't open %s: %r\n", in);
		toterrors++;
		return;
	}
	doemit := emitcode != "" || emitstub || emittab != "" || emitsbl != "";
	if(!doemit){
		bout = bufio->create(out, Bufio->OWRITE, 8r666);
		if(bout == nil){
			fprint(stderr, "can't open %s: %r\n", out);
			toterrors++;
			bins[0].close();
			return;
		}
		if(dosym){
			bsym = bufio->create(dbg, Bufio->OWRITE, 8r666);
			if(bsym == nil)
				fprint(stderr, "can't open %s: %r\n", dbg);
		}
	}

	lexstart(in);

	popscopes();
	typestart();
	declstart();
	nfnexp = 0;

	parset = sys->millisec();
	yyparse(yyctxt);
	parset = sys->millisec() - parset;

	checkt = sys->millisec();
	entry := typecheck(!doemit);
	checkt = sys->millisec() - checkt;

	modcom(entry);

	fns = nil;
	nfns = 0;
	descriptors = nil;

	if(debug['T'])
		print("times: parse=%d type=%d: gen=%d write=%d symbols=%d\n",
			parset, checkt, gent, writet, symt);

	if(bout != nil)
		bout.close();
	if(bsym != nil)
		bsym.close();
	toterrors += errors;
	if(errors && bout != nil)
		sys->remove(out);
	if(errors && bsym != nil)
		sys->remove(dbg);
}

pwd(): string
{
	workdir := load Workdir Workdir->PATH;
	if(workdir == nil)
		cd := "/";
	else
		cd = workdir->init();
	# sys->print("pwd: %s\n", cd);
	return cd;
}

cleanname(s: string): string
{
	ls, path: list of string;

	if(s == nil)
		return nil;
	if(s[0] != '/' && s[0] != '\\')
		(nil, ls) = sys->tokenize(pwd(), "/\\");
	for( ; ls != nil; ls = tl ls)
		path = hd ls :: path;
	(nil, ls) = sys->tokenize(s, "/\\");
	for( ; ls != nil; ls = tl ls){
		n := hd ls;
		if(n == ".")
			;
		else if (n == ".."){
			if(path != nil)
				path = tl path;
		}
		else
			path = n :: path;
	}
	p := "";
	for( ; path != nil; path = tl path)
		p = "/" + hd path + p;
	if(p == nil)
		p = "/";
	# sys->print("cleanname: %s\n", p);
	return p;
}

srcpath(): string
{
	srcp := cleanname(infile);
	# sys->print("srcpath: %s\n", srcp);
	return srcp;
}
yyexca := array[] of {-1, 1,
	1, -1,
	-2, 0,
-1, 3,
	1, 3,
	-2, 0,
-1, 17,
	39, 88,
	50, 62,
	54, 88,
	99, 62,
	-2, 253,
-1, 211,
	59, 29,
	71, 29,
	-2, 0,
-1, 230,
	1, 2,
	-2, 0,
-1, 274,
	50, 176,
	-2, 258,
-1, 309,
	59, 41,
	71, 41,
	91, 41,
	-2, 0,
-1, 311,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 381,
	50, 62,
	99, 62,
	-2, 253,
-1, 382,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 388,
	53, 71,
	54, 71,
	-2, 110,
-1, 390,
	53, 72,
	54, 72,
	-2, 112,
-1, 422,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 429,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 444,
	53, 71,
	54, 71,
	-2, 111,
-1, 445,
	53, 72,
	54, 72,
	-2, 113,
-1, 453,
	71, 280,
	99, 280,
	-2, 163,
-1, 470,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 487,
	50, 126,
	99, 126,
	-2, 240,
-1, 492,
	71, 277,
	-2, 0,
-1, 504,
	59, 47,
	71, 47,
	-2, 0,
-1, 509,
	59, 41,
	71, 41,
	91, 41,
	-2, 0,
-1, 515,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 549,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 555,
	71, 154,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 563,
	56, 59,
	62, 59,
	-2, 62,
-1, 569,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 574,
	71, 157,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 578,
	72, 176,
	-2, 163,
-1, 597,
	71, 160,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 603,
	71, 168,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 607,
	72, 175,
	85, 150,
	86, 150,
	87, 150,
	89, 150,
	90, 150,
	91, 150,
	-2, 0,
-1, 610,
	50, 62,
	56, 171,
	62, 171,
	99, 62,
	-2, 253,
};
YYNPROD: con 285;
YYPRIVATE: con 57344;
yytoknames: array of string;
yystates: array of string;
yydebug: con 0;
YYLAST:	con 2705;
yyact := array[] of {
 380, 592, 454, 365, 506, 385, 413, 311, 370, 315,
 360, 452, 450, 185,  84,  83, 433, 299, 271,  15,
   8,  49, 213, 102, 321,  12,  42, 110,  48,  78,
  79,  80,   4,  35, 198,  51,  23, 492, 364,   6,
 424,   3,   6, 545, 487, 401, 366,  14, 460,  21,
  14,  87, 331, 287, 383, 459, 354, 351,  85, 294,
 286,  90, 118, 226, 223, 112,  46, 225,  31, 466,
 309,  92,  82, 186, 164, 165, 166, 167, 168, 169,
 170, 171, 172, 173, 174, 175, 176, 310, 117, 423,
 182, 183, 184,  88,  89,  86, 322, 205, 105, 208,
  71,  10, 287, 287,  10, 350, 600, 518, 586,  77,
  40, 548, 350, 119, 350, 295,  32,  32, 295, 287,
  44, 119, 486, 484, 231, 232, 233, 234, 235, 236,
 237, 238, 239, 240, 241, 242, 244, 245, 246, 247,
 248, 249, 250, 251, 252, 253, 254, 255, 256, 257,
 258, 259, 260, 261, 262, 263, 264, 265, 266, 186,
   6,  22, 274, 230, 483,  11, 210, 514,  14,   5,
 272,  22, 268, 566, 602, 429, 428, 427, 280, 431,
 430, 432, 285, 411, 596,  43,  37, 482, 207, 289,
  87, 439, 425, 416, 290, 410, 270,  85,  93, 209,
  90, 202,  99, 416, 217, 114,  19, 408, 304,  22,
  92,  82, 212, 313, 312, 218, 194, 195, 193,  94,
 229, 355,  10, 567,  47,  96,  17,  98,  95, 100,
  18, 101,  88,  89,  86, 513, 298, 194, 195, 573,
   2,  26,  13, 314, 327, 306, 194, 195,  77, 112,
 324, 319,  87, 421, 420, 419, 206, 194, 195,  85,
 187,  25,  90,  23,  99, 560, 317, 194, 195,   6,
  24,  87,  92,  82, 194, 195, 536,  14,  85,   5,
 558,  90, 554,  99, 186, 228, 192,  96, 341,  98,
  95,  92,  82, 531,  88,  89,  86, 339, 182, 194,
 195, 194, 195, 215, 337, 537, 526, 491, 464, 463,
  77, 342, 101,  88,  89,  86,  19,  44, 496, 509,
 302, 382, 349, 469, 400, 384, 499, 359, 358,  77,
 480,  10, 394, 468, 399, 362,  17, 390, 388, 392,
  18, 283, 219, 211, 403, 325,  19, 488,  33, 326,
 393, 605,  13,  87, 357, 216, 318, 615, 581, 489,
  85,  19, 494,  90, 404, 405,  45, 580, 613, 282,
  18, 214, 417,  92,  82,  45, 422, 437, 565,  18,
 186, 115,  43, 108, 436, 116, 438, 540,  19, 114,
 386, 435, 442, 440, 505,  88,  89,  86, 508, 563,
 453, 544, 341, 183, 445, 444,  22, 415, 115, 317,
 605,  77, 116, 494, 481, 494, 604, 337, 494, 601,
  70, 598, 494,  63, 589, 541,  73, 474, 575, 470,
 434, 479, 443, 477,  76,  75,  69,  68,  74, 292,
  18,  54,  55,  62,  60,  61,  64,  87, 291, 269,
 453, 508,  91, 157,  85,  91, 120,  90,  65,  66,
  67, 104, 490, 494, 103, 498, 494,  92,  82, 556,
 159, 595, 495, 186,  77, 511, 478, 168, 194, 195,
 488, 524, 519, 523, 516, 517, 512, 501, 467,  88,
  89,  86,  87, 453, 528, 524, 530, 529, 418,  85,
 409, 534,  90, 594, 527,  77,  91,  39,  91, 533,
 538, 330,  92,  82, 224, 546,  91, 106, 569, 547,
 542, 524,  36, 553,  34, 402, 557,  91, 593, 500,
 555, 300, 501, 398,  88,  89,  86, 158, 336, 161,
 333, 162, 163, 561, 564, 442, 317, 201, 200, 197,
  77, 160, 159, 571, 179, 447, 578, 570, 576, 572,
 574, 177, 478,  81,  72, 332,  97, 181, 524, 446,
 584, 180, 177, 585,  73, 578, 178, 588, 329, 227,
 347, 346,  76,  75,  45, 562,  74,  41,  18, 415,
 203, 597, 607, 587, 549, 599, 478, 387, 578, 603,
 606,  91, 328, 222, 221, 608, 550, 612, 476, 475,
 472, 614, 426, 137, 135, 135, 478, 196,  91, 199,
  39,  91,  91, 188,  91,  19, 525, 204, 361, 539,
 308,  91, 183, 168, 288, 369, 121,   1, 220, 138,
 139, 140, 137, 135, 465,  91,  91, 141, 142, 138,
 139, 140, 137, 135, 478, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 134, 136, 273, 156,
 155, 154, 153, 152, 151, 149, 150, 145, 146, 147,
 148, 144, 143, 141, 142, 138, 139, 140, 137, 135,
  29, 344, 275,  27,  87, 316, 543, 583, 582, 414,
  91,  85,  30,  87,  90,  28, 504, 503, 591, 590,
  85,  16, 284,  90,  92,  82,  91, 412, 307, 356,
   9, 552,  91,  92,  82, 449, 551, 522, 521, 293,
   7, 451, 296, 297, 283, 338,  88,  89,  86, 267,
 507, 372, 199,  91, 109,  88,  89,  86, 107, 113,
 343, 111,  77,  91,  91,  20, 320, 323,  38,   0,
   0,  77,   0,   0,   0,   0,   0,  91,  91,   0,
   0,  91, 123, 124, 125, 126, 127, 128, 129, 130,
 131, 132, 133, 134, 136,   0, 156, 155, 154, 153,
 152, 151, 149, 150, 145, 146, 147, 148, 144, 143,
 141, 142, 138, 139, 140, 137, 135,   0,   0,   0,
  91, 334,   0,   0,   0,   0,   0,   0,   0,  91,
   0,   0,   0,  91,   0,   0,  50, 348,  91,   0,
  91,   0,   0, 352,   0,   0,   0,   0,   0,  91,
 568,  52,  53,  56,   0,  91,   0,  59,  72,   0,
   0, 281,  57,  58, 391,  63,   0,   0,  73,   0,
   0,   0,   0,   0, 396, 397,  76,  75,  69,  68,
  74,   0,  18,  54,  55,  62,  60,  61,  64,   0,
   0,   0, 406,   0,  91,   0,   0,   0,  91,   0,
  65,  66,  67,  87,   0,   0,   0,   0,   0,   0,
  85,   0,   0,  90,   0,   0,  77,   0,   0,  91,
   0,   0,   0,  92,  82,   0,   0, 367,   0,   0,
   0, 196,  91,   0,   0,   0,   0,   0,   0,   0,
 448,   0,  50, 407, 457,  88,  89,  86,   0, 461,
   0, 462,   0,   0,   0,   0,   0,  52,  53,  56,
  97,  77,   0,  59, 379,   0, 473,   0,  57,  58,
   0,  63, 371,   0,  73,   0,   0,   0,   0,   0,
   0,   0,  76,  75, 381,  68,  74,   0,  18,  54,
  55,  62,  60,  61,  64, 368, 510, 367,   0,   0,
  13,   0,   0,   0,   0, 497,  65,  66,  67, 502,
   0,   0,  50, 373,   0,   0,   0, 374, 375, 378,
 376, 377,  77,   0,   0,   0,   0,  52,  53,  56,
 502,   0,   0,  59, 379,   0,   0,   0,  57,  58,
   0,  63, 371, 535,  73,   0,   0,   0,   0,   0,
   0,   0,  76,  75, 381,  68,  74,   0,  18,  54,
  55,  62,  60,  61,  64, 368, 471, 367,   0,   0,
  13,   0,   0,   0,   0,   0,  65,  66,  67,   0,
   0,   0,  50, 373,   0,   0,   0, 374, 375, 378,
 376, 377,  77,   0,   0,   0,   0,  52,  53,  56,
   0,   0,   0,  59, 379,   0,   0,   0,  57,  58,
   0,  63, 371,   0,  73,   0,   0,   0,   0,   0,
   0,   0,  76,  75, 381,  68,  74,   0,  18,  54,
  55,  62,  60,  61,  64, 368, 441, 367,   0,   0,
  13,   0,   0,   0,   0,   0,  65,  66,  67,   0,
   0,   0,  50, 373,   0,   0,   0, 374, 375, 378,
 376, 377,  77,   0,   0,   0,   0,  52,  53,  56,
   0,   0,   0,  59, 379,   0,   0,   0,  57,  58,
   0,  63, 371,   0,  73,   0,   0,   0,   0,   0,
   0,   0,  76,  75, 381,  68,  74,   0,  18,  54,
  55,  62,  60,  61,  64, 368, 363, 609,   0,   0,
  13,   0,   0,   0,   0,   0,  65,  66,  67,   0,
   0,   0,  50, 373,   0,   0,   0, 374, 375, 378,
 376, 377,  77,   0,   0,   0,   0,  52,  53, 611,
   0,   0,   0,  59, 379,   0,   0,   0,  57,  58,
   0,  63, 371,   0,  73,   0,   0,   0,   0,   0,
   0,   0,  76,  75, 610,  68,  74,   0,  18,  54,
  55,  62,  60,  61,  64, 368, 577,   0,   0,   0,
  13,   0,   0,   0,   0,   0,  65,  66,  67,   0,
   0,  50,   0, 373,   0,   0,   0, 374, 375, 378,
 376, 377,  77,   0,   0,   0,  52,  53, 455,   0,
   0,   0,  59, 379,   0,   0,   0,  57,  58,   0,
  63, 371,   0,  73,   0,   0,   0,   0,   0,   0,
   0,  76,  75, 381,  68,  74,   0,  18,  54,  55,
  62,  60,  61,  64, 368, 367,   0,   0,   0,  13,
   0,   0,   0,   0,   0,  65,  66,  67,   0,   0,
  50,   0, 373,   0,   0,   0, 374, 375, 378, 376,
 377,  77,   0,   0,   0,  52,  53,  56,   0,   0,
   0,  59, 379,   0,   0,   0,  57,  58,   0,  63,
 371,   0,  73,   0,   0,   0,   0,   0,   0,   0,
  76,  75, 381,  68,  74,   0,  18,  54,  55,  62,
  60,  61,  64, 368, 456, 144, 143, 141, 142, 138,
 139, 140, 137, 135,  65,  66,  67,   0,   0,  50,
   0, 373,   0,   0,   0, 374, 375, 378, 376, 377,
  77,   0,   0,   0,  52,  53, 455,   0,   0,   0,
  59,  72,   0,   0,   0,  57,  58,   0,  63,   0,
   0,  73,   0,   0,   0,   0,   0,   0,   0,  76,
  75,  69,  68,  74,   0,  18,  54,  55,  62,  60,
  61,  64,   0,   0,  50,   0,   0,   0,   0,   0,
   0,   0,   0,  65,  66,  67,   0,  87,   0,  52,
  53,  56,   0,   0,  85,  59,  72,  90,   0,  77,
  57,  58,   0,  63,   0,   0,  73,  92,  82,   0,
   0,   0,   0,   0,  76,  75,  69, 276,  74,   0,
  18,  54,  55,  62,  60,  61,  64, 301, 243,  88,
  89,  86,   0,   0,   0,   0, 279,   0, 277, 278,
  67,  50,   0,   0,   0,  77,   0,   0,   0,   0,
   0,   0,   0,   0,  77,   0,  52,  53,  56,   0,
   0,   0,  59,  72,   0,   0,   0,  57,  58,   0,
  63,   0,   0,  73,   0,   0,   0,   0,   0,   0,
   0,  76,  75,  69,  68,  74,   0,  18,  54,  55,
  62,  60,  61,  64,   0,   0,  50,   0,   0,   0,
   0,   0,   0,   0,   0,  65,  66,  67,   0,   0,
   0,  52,  53,  56,   0,   0,   0,  59,  72,   0,
   0,  77,  57,  58,   0,  63,   0,   0,  73,   0,
   0,   0,   0,   0,   0,   0,  76,  75,  69,  68,
  74,   0,  18,  54,  55,  62,  60,  61,  64,   0,
   0,   0,  52,  53,  56,   0,   0,   0,  59,  72,
  65,  66,  67,  57,  58,   0,  63,   0,   0,  73,
   0,   0,   0,   0,   0,   0,  77,  76,  75,  69,
  68,  74,   0,  18,  54,  55,  62,  60,  61,  64,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,  65,  66,  67, 123, 124, 125, 126, 127, 128,
 129, 130, 131, 132, 133, 134, 136,  77, 156, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136, 559, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135, 154, 153, 152, 151, 149, 150,
 145, 146, 147, 148, 144, 143, 141, 142, 138, 139,
 140, 137, 135,   0, 123, 124, 125, 126, 127, 128,
 129, 130, 131, 132, 133, 134, 136, 532, 156, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135, 152,
 151, 149, 150, 145, 146, 147, 148, 144, 143, 141,
 142, 138, 139, 140, 137, 135,   0,   0,   0, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136, 485, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135, 151, 149, 150, 145, 146, 147,
 148, 144, 143, 141, 142, 138, 139, 140, 137, 135,
   0,   0,   0,   0, 123, 124, 125, 126, 127, 128,
 129, 130, 131, 132, 133, 134, 136, 353, 156, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135,   0,   0,   0,   0,   0, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136, 345, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135, 145, 146, 147, 148, 144, 143,
 141, 142, 138, 139, 140, 137, 135,   0,   0,   0,
   0,   0,   0,   0, 123, 124, 125, 126, 127, 128,
 129, 130, 131, 132, 133, 134, 136, 305, 156, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136, 303, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0, 123, 124, 125, 126, 127, 128,
 129, 130, 131, 132, 133, 134, 136, 191, 156, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136, 190, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0, 123, 124, 125, 126, 127, 128,
 129, 130, 131, 132, 133, 134, 136, 189, 156, 155,
 154, 153, 152, 151, 149, 150, 145, 146, 147, 148,
 144, 143, 141, 142, 138, 139, 140, 137, 135,   0,
  87,   0,   0,   0,  87,   0,   0,  85,   0,   0,
  90, 389,   0,   0,  90,   0,   0,   0,   0,   0,
  92, 395,   0,   0,  92,  82,   0,   0,   0,   0,
   0,   0, 122,   0,   0,   0,   0,   0,   0,   0,
   0,   0,  88,  89,  86,   0,  88,  89,  86,   0,
   0,   0,   0,   0,   0,   0,   0,   0,  77,   0,
   0,   0,  77, 123, 124, 125, 126, 127, 128, 129,
 130, 131, 132, 133, 134, 136,   0, 156, 155, 154,
 153, 152, 151, 149, 150, 145, 146, 147, 148, 144,
 143, 141, 142, 138, 139, 140, 137, 135,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0, 123, 124, 125, 126,
 127, 128, 129, 130, 131, 132, 133, 134, 136, 579,
 156, 155, 154, 153, 152, 151, 149, 150, 145, 146,
 147, 148, 144, 143, 141, 142, 138, 139, 140, 137,
 135,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136, 520, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135,   0,   0,   0, 123, 124, 125,
 126, 127, 128, 129, 130, 131, 132, 133, 134, 136,
 493, 156, 155, 154, 153, 152, 151, 149, 150, 145,
 146, 147, 148, 144, 143, 141, 142, 138, 139, 140,
 137, 135,   0,   0,   0, 340, 123, 124, 125, 126,
 127, 128, 129, 130, 131, 132, 133, 134, 136,   0,
 156, 155, 154, 153, 152, 151, 149, 150, 145, 146,
 147, 148, 144, 143, 141, 142, 138, 139, 140, 137,
 135,   0,   0,   0, 335, 123, 124, 125, 126, 127,
 128, 129, 130, 131, 132, 133, 134, 136,   0, 156,
 155, 154, 153, 152, 151, 149, 150, 145, 146, 147,
 148, 144, 143, 141, 142, 138, 139, 140, 137, 135,
   0, 515, 123, 124, 125, 126, 127, 128, 129, 130,
 131, 132, 133, 134, 136,   0, 156, 155, 154, 153,
 152, 151, 149, 150, 145, 146, 147, 148, 144, 143,
 141, 142, 138, 139, 140, 137, 135,   0, 458, 123,
 124, 125, 126, 127, 128, 129, 130, 131, 132, 133,
 134, 136,   0, 156, 155, 154, 153, 152, 151, 149,
 150, 145, 146, 147, 148, 144, 143, 141, 142, 138,
 139, 140, 137, 135, 156, 155, 154, 153, 152, 151,
 149, 150, 145, 146, 147, 148, 144, 143, 141, 142,
 138, 139, 140, 137, 135,
};
yypact := array[] of {
 167,-1000, 347, 277,-1000, 198,-1000,-1000, 189, 169,
 689, 686,  18, 287, 474,-1000, 468, 546,-1000, 307,
 -33, 152,-1000,-1000,-1000,-1000,-1000,1579,1579,1579,
1579, 314, 586, 147, 151, 412, 402,  11, 467, 349,
-1000, 347,  22,-1000,-1000,-1000, 397,-1000,2250,-1000,
 394, 498,1620,1620,1620,1620,1620,1620,1620,1620,
1620,1620,1620,1620,1620, 531, 509, 526,1620, 377,
1620,-1000,1579, 581,-1000,-1000,-1000, 584,2195,2140,
2085, 214,-1000,-1000,-1000, 314, 504, 314, 503, 502,
 546,-1000, 549,-1000,-1000, 314,1579, 184,1579, 127,
 273, 546, 301, 316, 546, 272, 314, 564, 563, -35,
-1000, 464,  17, -36,-1000,-1000,-1000, 537,-1000, 307,
-1000, 277,-1000,1579,1579,1579,1579,1579,1579,1579,
1579,1579,1579,1579,1579,1524,1579,1579,1579,1579,
1579,1579,1579,1579,1579,1579,1579,1579,1579,1579,
1579,1579,1579,1579,1579,1579,1579,1579,1579, 390,
 525,1457,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
-1000,-1000,-1000,-1000,-1000,-1000,-1000, 809, 309, 271,
 314,1579,-1000,-1000,-1000,  20,2645,-1000,1579,-1000,
-1000,-1000,-1000,1579, 389, 380, 425, 314,  19, 425,
 314, 314, 581,1448, 248,2030,-1000,1579,1975,-1000,
 314, 628,   0,-1000,-1000, 143, 307,-1000,-1000, 347,
 425,-1000,-1000, 322,  12,  12, 286,-1000,-1000,-1000,
 277,2645,2645,2645,2645,2645,2645,2645,2645,2645,
2645,2645,2645,1579, 577,2645, 576, 576, 576, 576,
 605, 605, 615, 615,1375,1375,1375,1375,1988,1988,
1935,1881,1827,1774,1774,1720,2666, 562, -46,-1000,
 416, 536, 461, -47,2645,-1000,1620, 520, 495, 314,
2532, 493,1620,1579, 425,2493,-1000,1579, 301, 651,
1920, 540, 539, 425,-1000, 314, 425, 425, 412,  15,
 425, 314,-1000,-1000,1865,-1000,  16, 150,-1000, 626,
 265,1125,-1000,-1000,  14, 254,-1000, 328, 557,-1000,
 425,-1000,2255, 425,-1000,-1000,-1000,2645,-1000,-1000,
1579,1457,2251, 664, 425, 488, 264,-1000, 253, -54,
 480,2645,-1000,1579,-1000,-1000,1448,1448, 425,-1000,
 854,-1000, 425,-1000, 135,-1000,-1000, 450, 123,-1000,
 112,-1000, 347,-1000,-1000,-1000, 448, 183,-1000, -10,
 120, 573,  90, 371, 371,1579,1579,1579, 119,1579,
2645, 377,1055,-1000,-1000, 347,-1000,-1000,-1000, 314,
-1000, 425, 527, 513,2645,1620, 425, 425, 655,1402,
-1000,1579, 314,2608,  13,   6, 425, 314,-1000, 232,
-1000, -18,-1000,-1000,-1000, 438, 263, 252, 213,-1000,
-1000,-1000, 985, 571, 314,-1000,1579, 570, 569,1333,
1579, 260, 355, 115,-1000,  92,  51,1810,  50,-1000,
   4,-1000,-1000, 297,-1000,-1000,-1000,-1000, 425,1402,
 236, -62,-1000,2455, 410,1620,-1000, 425,-1000,-1000,
-1000, 425, 246, 314,1579,-1000, 256, 453, 392, 249,
 915, 424,1579, 163,2571,1579,1579,  21, 432,2402,
1402, 610,-1000,-1000,-1000,-1000,-1000,-1000, 408,-1000,
 235,-1000,1402,1579,1402,1579,-1000, 221,1755, 347,
1579, 314, 204, 234, 627,-1000, 325, 369,-1000, 626,
-1000, 342,   3,-1000,1579,1333,  39, 554, 567,-1000,
1402, 211,-1000, 407,2455,1579,-1000,-1000,2645,-1000,
2645,-1000,-1000, 209,1700, 193,-1000,-1000, 340, 339,
-1000, 319, 102, 153,-1000,-1000, 768, 470,1579,1333,
1579, 168,-1000, 366,-1000,1264,-1000,2349,-1000,-1000,
-1000, 305, 430,-1000, 296,-1000,-1000,1402,-1000,1333,
  36,-1000, 553,-1000,1264,-1000, 362, 183,2455, 469,
-1000,-1000, 113,-1000, 359,-1000,1579,  34, 357,-1000,
 103,-1000, 354,-1000,-1000,-1000,-1000,1264,-1000, 552,
-1000,-1000,-1000,1195,-1000, 469, 306,1333, 295, 183,
 377,1620,-1000,-1000,-1000,-1000,
};
yypgo := array[] of {
   0, 531, 758, 186,  33,  24, 420,  15,  14,  46,
 755, 751, 749,  34, 748, 744,  27, 741,  16,   4,
 740, 110,   8,   0,  21,  35,  13, 739, 735, 100,
  25, 165,  26,  12, 731,  11,   2,  38,  41,  32,
 730,  22,   3,   7, 728, 727, 726, 721, 720,  20,
 719, 718, 717,  10, 711, 709, 708,   1, 707, 706,
 699,   6,   5, 698, 697, 696,  19,  23, 695,   9,
 692,  18, 668, 644,  17, 637, 636, 635, 634,
};
yyr1 := array[] of {
   0,  76,  75,  75,  38,  38,  39,  39,  39,  39,
  39,  39,  39,  39,  39,  39,  39,  30,  30,  37,
  37,  37,  37,  37,  37,  37,  66,  66,  48,  51,
  51,  51,  50,  50,  50,  50,  50,  49,  49,  73,
  73,  53,  53,  53,  52,  52,  52,  62,  62,  61,
  61,  60,  58,  58,  58,  59,  59,  59,  19,  20,
  20,   9,  10,  10,   6,   6,  74,  74,  74,  74,
   1,   1,   1,   1,   1,   1,   1,   1,   1,   1,
   1,   1,   7,   7,   8,   8,  13,  13,  21,  21,
   2,   2,   2,   3,   3,   4,   4,  14,  14,  15,
  15,  16,  16,  16,  16,  11,  12,  12,  12,  12,
   5,   5,   5,   5,  40,  67,  67,  67,  41,  41,
  41,  54,  54,  43,  43,  43,  77,  77,  42,  42,
  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
  42,  42,  42,  42,  42,  42,  42,  42,  42,  42,
  17,  17,  18,  18,  44,  45,  45,  46,  47,  47,
  63,  64,  64,  36,  36,  36,  36,  36,  55,  56,
  56,  57,  57,  57,  57,  22,  22,  23,  23,  23,
  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
  23,  23,  23,  23,  23,  23,  23,  23,  23,  23,
  23,  23,  23,  23,  24,  24,  24,  24,  24,  24,
  24,  24,  24,  24,  24,  24,  24,  24,  24,  24,
  24,  24,  24,  24,  24,  24,  24,  24,  25,  25,
  25,  78,  25,  25,  25,  25,  25,  25,  25,  25,
  25,  25,  25,  29,  29,  31,  72,  72,  71,  71,
  70,  70,  70,  70,  65,  65,  32,  32,  32,  32,
  27,  27,  28,  28,  26,  26,  33,  33,  34,  34,
  35,  35,  69,  68,  68,
};
yyr2 := array[] of {
   0,   0,   5,   1,   1,   2,   2,   1,   1,   2,
   2,   4,   4,   4,   4,   4,   6,   1,   3,   3,
   5,   5,   4,   6,   5,   1,   4,   7,   6,   0,
   2,   1,   4,   2,   5,   5,   1,   8,  11,   0,
   4,   0,   2,   1,   1,   1,   5,   0,   2,   5,
   4,   4,   2,   2,   1,   2,   4,   4,   1,   1,
   3,   1,   1,   3,   6,   4,   1,   2,   3,   4,
   1,   1,   1,   3,   6,   2,   3,   3,   3,   3,
   4,   1,   1,   4,   3,   6,   1,   3,   0,   3,
   3,   3,   5,   1,   3,   1,   5,   0,   1,   1,
   3,   3,   3,   3,   3,   1,   1,   1,   3,   3,
   2,   3,   2,   3,   4,   4,   2,   0,   3,   2,
   4,   2,   4,   0,   2,   2,   3,   5,   2,   2,
   4,   3,   4,   6,   2,   5,   7,  10,   6,   8,
   3,   3,   3,   3,   3,   6,   5,   8,   2,   8,
   0,   2,   0,   1,   2,   2,   4,   2,   2,   4,
   2,   2,   4,   1,   3,   1,   3,   1,   2,   2,
   4,   1,   1,   3,   1,   0,   1,   1,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   4,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   1,   2,   2,   2,   2,   2,
   2,   2,   2,   2,   2,   2,   2,   2,   6,   8,
   7,   5,   3,   6,   4,   2,   2,   2,   1,   4,
   3,   0,   4,   3,   3,   4,   6,   2,   2,   1,
   1,   1,   6,   1,   1,   3,   1,   3,   1,   1,
   1,   3,   3,   2,   1,   0,   1,   1,   3,   3,
   0,   1,   1,   2,   1,   3,   1,   2,   1,   3,
   1,   3,   2,   2,   4,
};
yychk := array[] of {
-1000, -75,  73, -38, -39,   2, -37, -40, -49, -48,
 -29, -31, -30,  75,  -9, -66, -54,  59,  63,  39,
 -10,  -9,  59, -39,  72,  72,  72,   4,  16,   4,
  16,  50,  99,  61,  50,  -4,  54,  -3,  -2,  39,
 -21,  41, -32, -31, -29,  59,  99,  72, -23, -24,
  17, -25,  32,  33,  64,  65,  34,  43,  44,  38,
  67,  68,  66,  46,  69,  81,  82,  83,  60,  59,
  -6, -29,  39,  49,  61,  58,  57,  97, -23, -23,
 -23,  -1,  60,  -7,  -8,  46,  83,  39,  81,  82,
  49,  -6,  59, -31,  72,  77,  74,  -1,  76,  51,
  78,  80, -67,  52,  59,  87,  50, -14,  34, -15,
 -16, -11, -30, -12, -31,  59,  63,  -9,  40,  99,
  59, -76,  72,   4,   5,   6,   7,   8,   9,  10,
  11,  12,  13,  14,  15,  38,  16,  37,  34,  35,
  36,  32,  33,  31,  30,  26,  27,  28,  29,  24,
  25,  23,  22,  21,  20,  19,  18,  59,  39,  54,
  53,  41,  43,  44, -24, -24, -24, -24, -24, -24,
 -24, -24, -24, -24, -24, -24, -24,  41,  45,  45,
  45,  41, -24, -24, -24, -26, -23,  -3,  39,  72,
  72,  72,  72,   4,  53,  54,  -1,  45, -13,  -1,
  45,  45, -21,  41,  -1, -23,  72,   4, -23,  72,
  39,  70, -21, -41,  70,   2,  39, -29, -21,  70,
  -1,  40,  40,  99,  50,  50,  99,  42, -31, -29,
 -38, -23, -23, -23, -23, -23, -23, -23, -23, -23,
 -23, -23, -23,   4, -23, -23, -23, -23, -23, -23,
 -23, -23, -23, -23, -23, -23, -23, -23, -23, -23,
 -23, -23, -23, -23, -23, -23, -23, -27, -26,  59,
 -25, -71, -22, -72, -23, -70,  60,  81,  82,  79,
 -23,  42,  60,  70,  -1, -23,  40,  99, -78, -23,
 -23,  59,  59,  -1,  40,  99,  -1,  -1,  -4, -74,
  -1,  79,  72,  72, -23,  72, -13, -51,   2,  70,
  87, -43,  71,  70, -32, -69, -68,  -9,  34, -16,
  -1,  -5,  84,  -1,  -5,  59,  63, -23,  40,  42,
  50,  99,  45,  45,  -1,  42,  45, -24, -28, -26,
  42, -23, -41,  99,  40,  72,  41,  41,  -1, -67,
  99,  42,  -1,  72,  40,  71, -50,  -9, -49, -66,
 -53,   2,  70,  71, -37, -42,  -9,   2,  70, -77,
 -22,  47, -17,  88,  92,  93,  95,  96,  94,  39,
 -23,  59, -43,  40,  71, -62,  62,  40,  -7,  46,
  -8,  -1, -22, -71, -23,  60,  -1,  -1,  45,  70,
  71,  99,  45, -23, -74, -74,  -1,  79,  72,  50,
  72,  71, -52, -61, -60,  -9,  91, -69,  50,  72,
  71,  70, -43,  99,  50,  72,  39,  87,  86,  85,
  90,  89,  91, -18,  59, -18, -22, -23, -22,  72,
 -26,  71, -61,  -9,  -7,  -8,  42,  42,  -1,  70,
 -33, -34, -35, -23, -36,  34,   2,  -1,  40,  42,
  42,  -1,  -1,  77,  76, -73,  87,  50,  70,  71,
 -43,  71,  39,  -1, -23,  39,  39, -42,  -9, -23,
  70,  59,  72,  72,  72,  72,  72,  40,  50,  62,
 -33,  71,  99,  55,  56,  62,  72,  -1, -23,  70,
  76,  79,  -1, -58, -59,   2, -19, -20,  59,  70,
  71,  51, -26,  72,   4,  40, -22, -22,  86,  50,
  70, -44, -45, -36, -23,  16,  71, -35, -23, -36,
 -23,  72,  72, -69, -23,  -1,  72,  71, -62,   2,
  62,  56, -53, -65,  59,  40, -23, -42,  72,  40,
  39, -46, -47, -36,  71, -43,  62, -23,  71,  72,
  72, -19,  -9,  59, -19,  59,  71,  70,  72,  48,
 -22, -42, -22,  71, -43,  62, -36,   2, -23,  70,
  62,  62, -63, -64, -36, -42,  72,  40, -36,  62,
 -55, -56, -57,  59,  34,   2,  71, -43,  62, -22,
  72,  62,  71, -43,  62,  56, -36,  40, -57,   2,
  59,  34, -57,  62, -42,  62,
};
yydef := array[] of {
   0,  -2,   0,  -2,   4,   0,   7,   8,   0,   0,
   0,  17,   0,   0,   0,  25,   0,  -2, 254,   0,
  61,   0,  62,   5,   6,   9,  10,   0,   0,   0,
   0,   0,   0,   0,   0, 117,   0,  95,  93,  97,
 121,   0,   0, 266, 267, 253,   0,   1,   0, 177,
   0, 214,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0, 253,
   0, 238,   0,   0, 249, 250, 251,   0,   0,   0,
   0,   0,  70,  71,  72,   0,   0,   0,   0,   0,
  88,  81,  82,  18,  19,   0,   0,   0,   0,   0,
   0,  88,   0,   0,  88,   0,   0,   0,   0,  98,
  99,   0,   0, 105,  17, 106, 107,   0, 255,   0,
  63,   0,  11,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
   0,   0,   0,   0,   0,   0,   0,   0, 270,   0,
   0, 175, 247, 248, 215, 216, 217, 218, 219, 220,
 221, 222, 223, 224, 225, 226, 227,   0,   0,   0,
   0,   0, 235, 236, 237,   0, 274, 241,   0,  13,
  12,  14,  15,   0,   0,   0,  75,   0,   0,  86,
   0,   0,   0,   0,   0,   0,  22,   0,   0,  26,
   0,  -2,   0, 114, 123,   0,   0, 116, 122,   0,
  94,  90,  91,   0,   0,   0,   0,  89, 268, 269,
  -2, 178, 179, 180, 181, 182, 183, 184, 185, 186,
 187, 188, 189,   0, 191, 192, 194, 195, 196, 197,
 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
 208, 209, 210, 211, 212, 213, 193,   0, 271, 243,
 244, 256,   0,   0,  -2, 259, 260,   0,   0,   0,
   0,   0,   0,   0, 232,   0, 240,   0,   0,   0,
   0,  73,  84,  76,  77,   0,  78,  79, 117,   0,
  66,   0,  20,  21,   0,  24,   0,   0,  31,  -2,
   0,  -2, 119, 123,   0,   0,  47,   0,   0, 100,
 101, 102,   0, 103, 104, 108, 109, 190, 239, 245,
 175,   0,   0,   0, 263,   0,   0, 234,   0, 272,
   0, 275, 242,   0,  65,  16,   0,   0,  87,  80,
   0,  83,  67,  23,   0,  28,  30,   0,   0,  36,
   0,  43,   0, 118, 124, 125,   0,   0, 123,   0,
   0,   0,   0, 152, 152, 175,   0, 175,   0,   0,
 176,  -2,  -2, 115,  96, 282, 283,  92,  -2,   0,
  -2,   0,   0, 257, 258,  70, 261, 262,   0,   0,
 231, 273,   0,   0,   0,   0,  68,   0,  27,   0,
  33,  39,  42,  44,  45,   0,   0,   0, 151, 128,
 129, 123,  -2,   0,   0, 134,   0,   0,   0,  -2,
   0,   0,   0,   0, 153,   0,   0,   0,   0, 148,
   0, 120,  48,   0,  -2,  -2, 246, 252, 228,   0,
   0, 276, 278,  -2,   0, 165, 167, 233,  64,  74,
  85,  69,   0,   0,   0,  37,   0,   0,   0,   0,
  -2, 131,   0,   0,   0, 175, 175,   0,   0,   0,
   0,   0, 140, 141, 142, 143, 144,  -2,   0, 284,
   0, 230,  -2,   0,   0,   0,  32,   0,   0,   0,
   0,   0,   0,   0,  -2,  54,   0,  58,  59,  -2,
 130, 265,   0, 132,   0,  -2,   0,   0,   0, 151,
   0,   0, 123,   0, 163,   0, 229, 279, 164, 166,
 281,  34,  35,   0,   0,   0,  50,  51,  52,  53,
  55,   0,   0,   0, 264, 127,   0, 135, 175,  -2,
 175,   0, 123,   0, 146,  -2, 155,   0,  40,  46,
  49,   0,   0,  -2,   0,  60,  38,   0, 133,  -2,
   0, 138,   0, 145,  -2, 158,   0, 167,  -2,   0,
  56,  57,   0, 123,   0, 136, 175,   0,   0, 156,
   0, 123,   0, 171, 172, 174, 149,  -2, 161,   0,
 139, 159, 147,  -2, 169,   0,   0,  -2,   0, 174,
  -2, 172, 173, 162, 137, 170,
};
yytok1 := array[] of {
   1,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,  64,   3,   3,   3,  36,  23,   3,
  39,  40,  34,  32,  99,  33,  54,  35,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,  50,  72,
  26,   4,  27,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,  41,   3,  42,  22,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,   3,   3,   3,   3,   3,   3,   3,
   3,   3,   3,  70,  21,  71,  65,
};
yytok2 := array[] of {
   2,   3,   5,   6,   7,   8,   9,  10,  11,  12,
  13,  14,  15,  16,  17,  18,  19,  20,  24,  25,
  28,  29,  30,  31,  37,  38,  43,  44,  45,  46,
  47,  48,  49,  51,  52,  53,  55,  56,  57,  58,
  59,  60,  61,  62,  63,  66,  67,  68,  69,  73,
  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,
  94,  95,  96,  97,  98,
};
yytok3 := array[] of {
   0
};

YYSys: module
{
	FD: adt
	{
		fd:	int;
	};
	fildes:		fn(fd: int): ref FD;
	fprint:		fn(fd: ref FD, s: string, *): int;
};

yysys: YYSys;
yystderr: ref YYSys->FD;

YYFLAG: con -1000;

# parser for yacc output

yytokname(yyc: int): string
{
	if(yyc > 0 && yyc <= len yytoknames && yytoknames[yyc-1] != nil)
		return yytoknames[yyc-1];
	return "<"+string yyc+">";
}

yystatname(yys: int): string
{
	if(yys >= 0 && yys < len yystates && yystates[yys] != nil)
		return yystates[yys];
	return "<"+string yys+">\n";
}

yylex1(yylex: ref YYLEX): int
{
	c : int;
	yychar := yylex.lex();
	if(yychar <= 0)
		c = yytok1[0];
	else if(yychar < len yytok1)
		c = yytok1[yychar];
	else if(yychar >= YYPRIVATE && yychar < YYPRIVATE+len yytok2)
		c = yytok2[yychar-YYPRIVATE];
	else{
		n := len yytok3;
		c = 0;
		for(i := 0; i < n; i+=2) {
			if(yytok3[i+0] == yychar) {
				c = yytok3[i+1];
				break;
			}
		}
		if(c == 0)
			c = yytok2[1];	# unknown char
	}
	if(yydebug >= 3)
		yysys->fprint(yystderr, "lex %.4ux %s\n", yychar, yytokname(c));
	return c;
}

YYS: adt
{
	yyv: YYSTYPE;
	yys: int;
};

yyparse(yylex: ref YYLEX): int
{
	if(yydebug >= 1 && yysys == nil) {
		yysys = load YYSys "$Sys";
		yystderr = yysys->fildes(2);
	}

	yys := array[YYMAXDEPTH] of YYS;

	yyval: YYSTYPE;
	yystate := 0;
	yychar := -1;
	yynerrs := 0;		# number of errors
	yyerrflag := 0;		# error recovery flag
	yyp := -1;
	yyn := 0;

yystack:
	for(;;){
		# put a state and value onto the stack
		if(yydebug >= 4)
			yysys->fprint(yystderr, "char %s in %s", yytokname(yychar), yystatname(yystate));

		yyp++;
		if(yyp >= len yys)
			yys = (array[len yys * 2] of YYS)[0:] = yys;
		yys[yyp].yys = yystate;
		yys[yyp].yyv = yyval;

		for(;;){
			yyn = yypact[yystate];
			if(yyn > YYFLAG) {	# simple state
				if(yychar < 0)
					yychar = yylex1(yylex);
				yyn += yychar;
				if(yyn >= 0 && yyn < YYLAST) {
					yyn = yyact[yyn];
					if(yychk[yyn] == yychar) { # valid shift
						yychar = -1;
						yyp++;
						if(yyp >= len yys)
							yys = (array[len yys * 2] of YYS)[0:] = yys;
						yystate = yyn;
						yys[yyp].yys = yystate;
						yys[yyp].yyv = yylex.lval;
						if(yyerrflag > 0)
							yyerrflag--;
						if(yydebug >= 4)
							yysys->fprint(yystderr, "char %s in %s", yytokname(yychar), yystatname(yystate));
						continue;
					}
				}
			}
		
			# default state action
			yyn = yydef[yystate];
			if(yyn == -2) {
				if(yychar < 0)
					yychar = yylex1(yylex);
		
				# look through exception table
				for(yyxi:=0;; yyxi+=2)
					if(yyexca[yyxi] == -1 && yyexca[yyxi+1] == yystate)
						break;
				for(yyxi += 2;; yyxi += 2) {
					yyn = yyexca[yyxi];
					if(yyn < 0 || yyn == yychar)
						break;
				}
				yyn = yyexca[yyxi+1];
				if(yyn < 0){
					yyn = 0;
					break yystack;
				}
			}

			if(yyn != 0)
				break;

			# error ... attempt to resume parsing
			if(yyerrflag == 0) { # brand new error
				yylex.error("syntax error");
				yynerrs++;
				if(yydebug >= 1) {
					yysys->fprint(yystderr, "%s", yystatname(yystate));
					yysys->fprint(yystderr, "saw %s\n", yytokname(yychar));
				}
			}

			if(yyerrflag != 3) { # incompletely recovered error ... try again
				yyerrflag = 3;
	
				# find a state where "error" is a legal shift action
				while(yyp >= 0) {
					yyn = yypact[yys[yyp].yys] + YYERRCODE;
					if(yyn >= 0 && yyn < YYLAST) {
						yystate = yyact[yyn];  # simulate a shift of "error"
						if(yychk[yystate] == YYERRCODE)
							continue yystack;
					}
	
					# the current yyp has no shift onn "error", pop stack
					if(yydebug >= 2)
						yysys->fprint(yystderr, "error recovery pops state %d, uncovers %d\n",
							yys[yyp].yys, yys[yyp-1].yys );
					yyp--;
				}
				# there is no state on the stack with an error shift ... abort
				yyn = 1;
				break yystack;
			}

			# no shift yet; clobber input char
			if(yydebug >= 2)
				yysys->fprint(yystderr, "error recovery discards %s\n", yytokname(yychar));
			if(yychar == YYEOFCODE) {
				yyn = 1;
				break yystack;
			}
			yychar = -1;
			# try again in the same state
		}
	
		# reduction by production yyn
		if(yydebug >= 2)
			yysys->fprint(yystderr, "reduce %d in:\n\t%s", yyn, yystatname(yystate));
	
		yypt := yyp;
		yyp -= yyr2[yyn];
#		yyval = yys[yyp+1].yyv;
		yym := yyn;
	
		# consult goto table to find next state
		yyn = yyr1[yyn];
		yyg := yypgo[yyn];
		yyj := yyg + yys[yyp].yys + 1;
	
		if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn)
			yystate = yyact[yyg];
		case yym {
			
1=>
#line	153	"limbo.y"
{
		impmods = yys[yypt-1].yyv.ids;
	}
2=>
#line	156	"limbo.y"
{
		tree = rotater(yys[yypt-0].yyv.node);
	}
3=>
#line	160	"limbo.y"
{
		impmods = nil;
		tree = rotater(yys[yypt-0].yyv.node);
	}
4=>
yyval.node = yys[yyp+1].yyv.node;
5=>
#line	168	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil)
			yyval.node = yys[yypt-0].yyv.node;
		else if(yys[yypt-0].yyv.node == nil)
			yyval.node = yys[yypt-1].yyv.node;
		else
			yyval.node = mkbin(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
	}
6=>
#line	179	"limbo.y"
{
		yyval.node = nil;
	}
7=>
yyval.node = yys[yyp+1].yyv.node;
8=>
yyval.node = yys[yyp+1].yyv.node;
9=>
yyval.node = yys[yyp+1].yyv.node;
10=>
yyval.node = yys[yyp+1].yyv.node;
11=>
#line	187	"limbo.y"
{
		yyval.node = mkbin(Oas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
	}
12=>
#line	191	"limbo.y"
{
		yyval.node = mkbin(Oas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
	}
13=>
#line	195	"limbo.y"
{
		yyval.node = mkbin(Odas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
	}
14=>
#line	199	"limbo.y"
{
		yyval.node = mkbin(Odas, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
	}
15=>
#line	203	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = nil;
	}
16=>
#line	208	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = nil;
	}
17=>
yyval.node = yys[yyp+1].yyv.node;
18=>
#line	216	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
19=>
#line	222	"limbo.y"
{
		includef(yys[yypt-1].yyv.tok.v.idval);
		yyval.node = nil;
	}
20=>
#line	227	"limbo.y"
{
		yyval.node = typedecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.ty);
	}
21=>
#line	231	"limbo.y"
{
		yyval.node = importdecl(yys[yypt-1].yyv.node, yys[yypt-4].yyv.ids);
		yyval.node.src.start = yys[yypt-4].yyv.ids.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
22=>
#line	237	"limbo.y"
{
		yyval.node = vardecl(yys[yypt-3].yyv.ids, yys[yypt-1].yyv.ty);
	}
23=>
#line	241	"limbo.y"
{
		yyval.node = mkbin(Ovardecli, vardecl(yys[yypt-5].yyv.ids, yys[yypt-3].yyv.ty), varinit(yys[yypt-5].yyv.ids, yys[yypt-1].yyv.node));
	}
24=>
#line	245	"limbo.y"
{
		yyval.node = condecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.node);
	}
25=>
yyval.node = yys[yyp+1].yyv.node;
26=>
#line	252	"limbo.y"
{
		yyval.node = exdecl(yys[yypt-3].yyv.ids, nil);
	}
27=>
#line	256	"limbo.y"
{
		yyval.node = exdecl(yys[yypt-6].yyv.ids, revids(yys[yypt-2].yyv.ids));
	}
28=>
#line	262	"limbo.y"
{
		yys[yypt-5].yyv.ids.src.stop = yys[yypt-0].yyv.tok.src.stop;
		yyval.node = moddecl(yys[yypt-5].yyv.ids, rotater(yys[yypt-1].yyv.node));
	}
29=>
#line	269	"limbo.y"
{
		yyval.node = nil;
	}
30=>
#line	273	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil)
			yyval.node = yys[yypt-0].yyv.node;
		else if(yys[yypt-0].yyv.node == nil)
			yyval.node = yys[yypt-1].yyv.node;
		else
			yyval.node = mkn(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
	}
31=>
#line	282	"limbo.y"
{
		yyval.node = nil;
	}
32=>
#line	288	"limbo.y"
{
		yyval.node = fielddecl(Dglobal, typeids(yys[yypt-3].yyv.ids, yys[yypt-1].yyv.ty));
	}
33=>
yyval.node = yys[yyp+1].yyv.node;
34=>
#line	293	"limbo.y"
{
		yyval.node = typedecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.ty);
	}
35=>
#line	297	"limbo.y"
{
		yyval.node = condecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.node);
	}
36=>
yyval.node = yys[yyp+1].yyv.node;
37=>
#line	304	"limbo.y"
{
		yys[yypt-7].yyv.ids.src.stop = yys[yypt-1].yyv.tok.src.stop;
		yyval.node = adtdecl(yys[yypt-7].yyv.ids, rotater(yys[yypt-2].yyv.node));
		yyval.node.ty.polys = yys[yypt-4].yyv.ids;
		yyval.node.ty.val = rotater(yys[yypt-0].yyv.node);
	}
38=>
#line	311	"limbo.y"
{
		yys[yypt-10].yyv.ids.src.stop = yys[yypt-0].yyv.tok.src.stop;
		yyval.node = adtdecl(yys[yypt-10].yyv.ids, rotater(yys[yypt-1].yyv.node));
		yyval.node.ty.polys = yys[yypt-7].yyv.ids;
		yyval.node.ty.val = rotater(yys[yypt-4].yyv.node);
	}
39=>
#line	320	"limbo.y"
{
		yyval.node = nil;
	}
40=>
#line	324	"limbo.y"
{
		yyval.node = yys[yypt-1].yyv.node;
	}
41=>
#line	330	"limbo.y"
{
		yyval.node = nil;
	}
42=>
#line	334	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil)
			yyval.node = yys[yypt-0].yyv.node;
		else if(yys[yypt-0].yyv.node == nil)
			yyval.node = yys[yypt-1].yyv.node;
		else
			yyval.node = mkn(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
	}
43=>
#line	343	"limbo.y"
{
		yyval.node = nil;
	}
44=>
yyval.node = yys[yyp+1].yyv.node;
45=>
yyval.node = yys[yyp+1].yyv.node;
46=>
#line	351	"limbo.y"
{
		yyval.node = condecl(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.node);
	}
47=>
#line	357	"limbo.y"
{
		yyval.node = nil;
	}
48=>
#line	361	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil)
			yyval.node = yys[yypt-0].yyv.node;
		else if(yys[yypt-0].yyv.node == nil)
			yyval.node = yys[yypt-1].yyv.node;
		else
			yyval.node = mkn(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
	}
49=>
#line	372	"limbo.y"
{
		for(d := yys[yypt-4].yyv.ids; d != nil; d = d.next)
			d.cyc = byte 1;
		yyval.node = fielddecl(Dfield, typeids(yys[yypt-4].yyv.ids, yys[yypt-1].yyv.ty));
	}
50=>
#line	378	"limbo.y"
{
		yyval.node = fielddecl(Dfield, typeids(yys[yypt-3].yyv.ids, yys[yypt-1].yyv.ty));
	}
51=>
#line	384	"limbo.y"
{
		yyval.node = yys[yypt-1].yyv.node;
	}
52=>
#line	390	"limbo.y"
{
		yys[yypt-1].yyv.node.right.right = yys[yypt-0].yyv.node;
		yyval.node = yys[yypt-1].yyv.node;
	}
53=>
#line	395	"limbo.y"
{
		yyval.node = nil;
	}
54=>
#line	399	"limbo.y"
{
		yyval.node = nil;
	}
55=>
#line	405	"limbo.y"
{
		yyval.node = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, yys[yypt-1].yyv.ids), nil));
		typeids(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-1].yyv.ids.src.stop, Tadtpick, nil, nil));
	}
56=>
#line	410	"limbo.y"
{
		yys[yypt-3].yyv.node.right.right = yys[yypt-2].yyv.node;
		yyval.node = mkn(Opickdecl, yys[yypt-3].yyv.node, mkn(Oseq, fielddecl(Dtag, yys[yypt-1].yyv.ids), nil));
		typeids(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-1].yyv.ids.src.stop, Tadtpick, nil, nil));
	}
57=>
#line	416	"limbo.y"
{
		yyval.node = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, yys[yypt-1].yyv.ids), nil));
		typeids(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-1].yyv.ids.src.stop, Tadtpick, nil, nil));
	}
58=>
#line	423	"limbo.y"
{
		yyval.ids = revids(yys[yypt-0].yyv.ids);
	}
59=>
#line	429	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
	}
60=>
#line	433	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, yys[yypt-2].yyv.ids);
	}
61=>
#line	439	"limbo.y"
{
		yyval.ids = revids(yys[yypt-0].yyv.ids);
	}
62=>
#line	445	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
	}
63=>
#line	449	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, yys[yypt-2].yyv.ids);
	}
64=>
#line	455	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-5].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfix, nil, nil);
		yyval.ty.val = mkbin(Oseq, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
	}
65=>
#line	460	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-3].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfix, nil, nil);
		yyval.ty.val = yys[yypt-1].yyv.node;
	}
66=>
#line	467	"limbo.y"
{
		yyval.types = addtype(yys[yypt-0].yyv.ty, nil);
	}
67=>
#line	471	"limbo.y"
{
		yyval.types = addtype(yys[yypt-0].yyv.ty, nil);
		yys[yypt-0].yyv.ty.flags |= CYCLIC;
	}
68=>
#line	476	"limbo.y"
{
		yyval.types = addtype(yys[yypt-0].yyv.ty, yys[yypt-2].yyv.types);
	}
69=>
#line	480	"limbo.y"
{
		yyval.types = addtype(yys[yypt-0].yyv.ty, yys[yypt-3].yyv.types);
		yys[yypt-0].yyv.ty.flags |= CYCLIC;
	}
70=>
#line	487	"limbo.y"
{
		yyval.ty = mkidtype(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
	}
71=>
#line	491	"limbo.y"
{
		yyval.ty = yys[yypt-0].yyv.ty;
	}
72=>
#line	495	"limbo.y"
{
		yyval.ty = yys[yypt-0].yyv.ty;
	}
73=>
#line	499	"limbo.y"
{
		yyval.ty = mkarrowtype(yys[yypt-2].yyv.ty.src.start, yys[yypt-0].yyv.tok.src.stop, yys[yypt-2].yyv.ty, yys[yypt-0].yyv.tok.v.idval);
	}
74=>
#line	503	"limbo.y"
{
		yyval.ty = mkarrowtype(yys[yypt-5].yyv.ty.src.start, yys[yypt-3].yyv.tok.src.stop, yys[yypt-5].yyv.ty, yys[yypt-3].yyv.tok.v.idval);
		yyval.ty = mkinsttype(yys[yypt-5].yyv.ty.src, yyval.ty, yys[yypt-1].yyv.types);
	}
75=>
#line	508	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-1].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tref, yys[yypt-0].yyv.ty, nil);
	}
76=>
#line	512	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tchan, yys[yypt-0].yyv.ty, nil);
	}
77=>
#line	516	"limbo.y"
{
		if(yys[yypt-1].yyv.ids.next == nil)
			yyval.ty = yys[yypt-1].yyv.ids.ty;
		else
			yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Ttuple, nil, revids(yys[yypt-1].yyv.ids));
	}
78=>
#line	523	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tarray, yys[yypt-0].yyv.ty, nil);
	}
79=>
#line	527	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tlist, yys[yypt-0].yyv.ty, nil);
	}
80=>
#line	531	"limbo.y"
{
		yys[yypt-1].yyv.ty.src.start = yys[yypt-3].yyv.tok.src.start;
		yys[yypt-1].yyv.ty.polys = yys[yypt-2].yyv.ids;
		yys[yypt-1].yyv.ty.eraises = yys[yypt-0].yyv.node;
		yyval.ty = yys[yypt-1].yyv.ty;
	}
81=>
yyval.ty = yys[yyp+1].yyv.ty;
82=>
#line	551	"limbo.y"
{
		yyval.ty = mkidtype(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
	}
83=>
#line	555	"limbo.y"
{
		yyval.ty = mkinsttype(yys[yypt-3].yyv.tok.src, mkidtype(yys[yypt-3].yyv.tok.src, yys[yypt-3].yyv.tok.v.idval), yys[yypt-1].yyv.types);
	}
84=>
#line	561	"limbo.y"
{
		yyval.ty = mkdottype(yys[yypt-2].yyv.ty.src.start, yys[yypt-0].yyv.tok.src.stop, yys[yypt-2].yyv.ty, yys[yypt-0].yyv.tok.v.idval);
	}
85=>
#line	565	"limbo.y"
{
		yyval.ty = mkdottype(yys[yypt-5].yyv.ty.src.start, yys[yypt-3].yyv.tok.src.stop, yys[yypt-5].yyv.ty, yys[yypt-3].yyv.tok.v.idval);
		yyval.ty = mkinsttype(yys[yypt-5].yyv.ty.src, yyval.ty, yys[yypt-1].yyv.types);
	}
86=>
#line	572	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.ty.src, nil, yys[yypt-0].yyv.ty, nil);
	}
87=>
#line	576	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-2].yyv.ids.src, nil, yys[yypt-0].yyv.ty, yys[yypt-2].yyv.ids);
	}
88=>
#line	582	"limbo.y"
{
		yyval.ids = nil;
	}
89=>
#line	586	"limbo.y"
{
		yyval.ids = polydecl(yys[yypt-1].yyv.ids);
	}
90=>
#line	592	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfn, tnone, yys[yypt-1].yyv.ids);
	}
91=>
#line	596	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfn, tnone, nil);
		yyval.ty.varargs = byte 1;
	}
92=>
#line	601	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-4].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tfn, tnone, yys[yypt-3].yyv.ids);
		yyval.ty.varargs = byte 1;
	}
93=>
#line	608	"limbo.y"
{
		yyval.ty = yys[yypt-0].yyv.ty;
	}
94=>
#line	612	"limbo.y"
{
		yys[yypt-2].yyv.ty.tof = yys[yypt-0].yyv.ty;
		yys[yypt-2].yyv.ty.src.stop = yys[yypt-0].yyv.ty.src.stop;
		yyval.ty = yys[yypt-2].yyv.ty;
	}
95=>
#line	620	"limbo.y"
{
		yyval.ty = yys[yypt-0].yyv.ty;
	}
96=>
#line	624	"limbo.y"
{
		yyval.ty = yys[yypt-4].yyv.ty;
		yyval.ty.val = rotater(yys[yypt-1].yyv.node);
	}
97=>
#line	631	"limbo.y"
{
		yyval.ids = nil;
	}
98=>
yyval.ids = yys[yyp+1].yyv.ids;
99=>
yyval.ids = yys[yyp+1].yyv.ids;
100=>
#line	639	"limbo.y"
{
		yyval.ids = appdecls(yys[yypt-2].yyv.ids, yys[yypt-0].yyv.ids);
	}
101=>
#line	645	"limbo.y"
{
		yyval.ids = typeids(yys[yypt-2].yyv.ids, yys[yypt-0].yyv.ty);
	}
102=>
#line	649	"limbo.y"
{
		yyval.ids = typeids(yys[yypt-2].yyv.ids, yys[yypt-0].yyv.ty);
		for(d := yyval.ids; d != nil; d = d.next)
			d.implicit = byte 1;
	}
103=>
#line	655	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-2].yyv.node.src, enter("junk", 0), yys[yypt-0].yyv.ty, nil);
		yyval.ids.store = Darg;
		yyerror("illegal argument declaration");
	}
104=>
#line	661	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-2].yyv.node.src, enter("junk", 0), yys[yypt-0].yyv.ty, nil);
		yyval.ids.store = Darg;
		yyerror("illegal argument declaration");
	}
105=>
#line	669	"limbo.y"
{
		yyval.ids = revids(yys[yypt-0].yyv.ids);
	}
106=>
#line	675	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
		yyval.ids.store = Darg;
	}
107=>
#line	680	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, nil, nil, nil);
		yyval.ids.store = Darg;
	}
108=>
#line	685	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, yys[yypt-2].yyv.ids);
		yyval.ids.store = Darg;
	}
109=>
#line	690	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, nil, nil, yys[yypt-2].yyv.ids);
		yyval.ids.store = Darg;
	}
110=>
#line	697	"limbo.y"
{
		yyval.ty = yys[yypt-0].yyv.ty;
	}
111=>
#line	701	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-1].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tref, yys[yypt-0].yyv.ty, nil);
	}
112=>
#line	705	"limbo.y"
{
		yyval.ty = yys[yypt-0].yyv.ty;
	}
113=>
#line	709	"limbo.y"
{
		yyval.ty = mktype(yys[yypt-1].yyv.tok.src.start, yys[yypt-0].yyv.tok.src.stop, Tref, yys[yypt-0].yyv.ty, nil);
	}
114=>
#line	715	"limbo.y"
{
		yyval.node = fndecl(yys[yypt-3].yyv.node, yys[yypt-2].yyv.ty, yys[yypt-0].yyv.node);
		nfns++;
		# patch up polydecs
		if(yys[yypt-3].yyv.node.op == Odot){
			if(yys[yypt-3].yyv.node.right.left != nil){
				yys[yypt-2].yyv.ty.polys = yys[yypt-3].yyv.node.right.left.decl;
				yys[yypt-3].yyv.node.right.left = nil;
			}
			if(yys[yypt-3].yyv.node.left.op == Oname && yys[yypt-3].yyv.node.left.left != nil){
				yyval.node.decl = yys[yypt-3].yyv.node.left.left.decl;
				yys[yypt-3].yyv.node.left.left = nil;
			}
		}
		else{
			if(yys[yypt-3].yyv.node.left != nil){
				yys[yypt-2].yyv.ty.polys = yys[yypt-3].yyv.node.left.decl;
				yys[yypt-3].yyv.node.left = nil;
			}
		}
		yys[yypt-2].yyv.ty.eraises = yys[yypt-1].yyv.node;
		yyval.node.src = yys[yypt-3].yyv.node.src;
	}
115=>
#line	741	"limbo.y"
{
		yyval.node = mkn(Otuple, rotater(yys[yypt-1].yyv.node), nil);
		yyval.node.src.start = yys[yypt-3].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
116=>
#line	747	"limbo.y"
{
		yyval.node = mkn(Otuple, mkunary(Oseq, yys[yypt-0].yyv.node), nil);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
	}
117=>
#line	753	"limbo.y"
{
		yyval.node = nil;
	}
118=>
#line	759	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil){
			yys[yypt-1].yyv.node = mkn(Onothing, nil, nil);
			yys[yypt-1].yyv.node.src.start = curline();
			yys[yypt-1].yyv.node.src.stop = yys[yypt-1].yyv.node.src.start;
		}
		yyval.node = rotater(yys[yypt-1].yyv.node);
		yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
119=>
#line	770	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
	}
120=>
#line	774	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
	}
121=>
#line	780	"limbo.y"
{
		yyval.node = mkname(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval);
		if(yys[yypt-0].yyv.ids != nil){
			yyval.node.left = mkn(Onothing, nil ,nil);
			yyval.node.left.decl = yys[yypt-0].yyv.ids;
		}
	}
122=>
#line	788	"limbo.y"
{
		yyval.node = mkbin(Odot, yys[yypt-3].yyv.node, mkname(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval));
		if(yys[yypt-0].yyv.ids != nil){
			yyval.node.right.left = mkn(Onothing, nil ,nil);
			yyval.node.right.left.decl = yys[yypt-0].yyv.ids;
		}
	}
123=>
#line	798	"limbo.y"
{
		yyval.node = nil;
	}
124=>
#line	802	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil)
			yyval.node = yys[yypt-0].yyv.node;
		else if(yys[yypt-0].yyv.node == nil)
			yyval.node = yys[yypt-1].yyv.node;
		else
			yyval.node = mkbin(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
	}
125=>
#line	811	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil)
			yyval.node = yys[yypt-0].yyv.node;
		else
			yyval.node = mkbin(Oseq, yys[yypt-1].yyv.node, yys[yypt-0].yyv.node);
	}
128=>
#line	824	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
129=>
#line	830	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
130=>
#line	836	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
131=>
#line	842	"limbo.y"
{
		if(yys[yypt-1].yyv.node == nil){
			yys[yypt-1].yyv.node = mkn(Onothing, nil, nil);
			yys[yypt-1].yyv.node.src.start = curline();
			yys[yypt-1].yyv.node.src.stop = yys[yypt-1].yyv.node.src.start;
		}
		yyval.node = mkscope(rotater(yys[yypt-1].yyv.node));
	}
132=>
#line	851	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
133=>
#line	858	"limbo.y"
{
		yyerror("illegal declaration");
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
134=>
#line	865	"limbo.y"
{
		yyval.node = yys[yypt-1].yyv.node;
	}
135=>
#line	869	"limbo.y"
{
		yyval.node = mkn(Oif, yys[yypt-2].yyv.node, mkunary(Oseq, yys[yypt-0].yyv.node));
		yyval.node.src.start = yys[yypt-4].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
	}
136=>
#line	875	"limbo.y"
{
		yyval.node = mkn(Oif, yys[yypt-4].yyv.node, mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node));
		yyval.node.src.start = yys[yypt-6].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
	}
137=>
#line	881	"limbo.y"
{
		yyval.node = mkunary(Oseq, yys[yypt-0].yyv.node);
		if(yys[yypt-2].yyv.node.op != Onothing)
			yyval.node.right = yys[yypt-2].yyv.node;
		yyval.node = mkbin(Ofor, yys[yypt-4].yyv.node, yyval.node);
		yyval.node.decl = yys[yypt-9].yyv.ids;
		if(yys[yypt-6].yyv.node.op != Onothing)
			yyval.node = mkbin(Oseq, yys[yypt-6].yyv.node, yyval.node);
	}
138=>
#line	891	"limbo.y"
{
		yyval.node = mkn(Ofor, yys[yypt-2].yyv.node, mkunary(Oseq, yys[yypt-0].yyv.node));
		yyval.node.src.start = yys[yypt-4].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
		yyval.node.decl = yys[yypt-5].yyv.ids;
	}
139=>
#line	898	"limbo.y"
{
		yyval.node = mkn(Odo, yys[yypt-2].yyv.node, yys[yypt-5].yyv.node);
		yyval.node.src.start = yys[yypt-6].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-1].yyv.tok.src.stop;
		yyval.node.decl = yys[yypt-7].yyv.ids;
	}
140=>
#line	905	"limbo.y"
{
		yyval.node = mkn(Obreak, nil, nil);
		yyval.node.decl = yys[yypt-1].yyv.ids;
		yyval.node.src = yys[yypt-2].yyv.tok.src;
	}
141=>
#line	911	"limbo.y"
{
		yyval.node = mkn(Ocont, nil, nil);
		yyval.node.decl = yys[yypt-1].yyv.ids;
		yyval.node.src = yys[yypt-2].yyv.tok.src;
	}
142=>
#line	917	"limbo.y"
{
		yyval.node = mkn(Oret, yys[yypt-1].yyv.node, nil);
		yyval.node.src = yys[yypt-2].yyv.tok.src;
		if(yys[yypt-1].yyv.node.op == Onothing)
			yyval.node.left = nil;
		else
			yyval.node.src.stop = yys[yypt-1].yyv.node.src.stop;
	}
143=>
#line	926	"limbo.y"
{
		yyval.node = mkn(Ospawn, yys[yypt-1].yyv.node, nil);
		yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-1].yyv.node.src.stop;
	}
144=>
#line	932	"limbo.y"
{
		yyval.node = mkn(Oraise, yys[yypt-1].yyv.node, nil);
		yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-1].yyv.node.src.stop;
	}
145=>
#line	938	"limbo.y"
{
		yyval.node = mkn(Ocase, yys[yypt-3].yyv.node, caselist(yys[yypt-1].yyv.node, nil));
		yyval.node.src = yys[yypt-3].yyv.node.src;
		yyval.node.decl = yys[yypt-5].yyv.ids;
	}
146=>
#line	944	"limbo.y"
{
		yyval.node = mkn(Oalt, caselist(yys[yypt-1].yyv.node, nil), nil);
		yyval.node.src = yys[yypt-3].yyv.tok.src;
		yyval.node.decl = yys[yypt-4].yyv.ids;
	}
147=>
#line	950	"limbo.y"
{
		yyval.node = mkn(Opick, mkbin(Odas, mkname(yys[yypt-5].yyv.tok.src, yys[yypt-5].yyv.tok.v.idval), yys[yypt-3].yyv.node), caselist(yys[yypt-1].yyv.node, nil));
		yyval.node.src.start = yys[yypt-5].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-3].yyv.node.src.stop;
		yyval.node.decl = yys[yypt-7].yyv.ids;
	}
148=>
#line	957	"limbo.y"
{
		yyval.node = mkn(Oexit, nil, nil);
		yyval.node.src = yys[yypt-1].yyv.tok.src;
	}
149=>
#line	962	"limbo.y"
{
		if(yys[yypt-6].yyv.node == nil){
			yys[yypt-6].yyv.node = mkn(Onothing, nil, nil);
			yys[yypt-6].yyv.node.src.start = yys[yypt-6].yyv.node.src.stop = curline();
		}
		yys[yypt-6].yyv.node = mkscope(rotater(yys[yypt-6].yyv.node));
		yyval.node = mkbin(Oexstmt, yys[yypt-6].yyv.node, mkn(Oexcept, yys[yypt-3].yyv.node, caselist(yys[yypt-1].yyv.node, nil)));
	}
150=>
#line	977	"limbo.y"
{
		yyval.ids = nil;
	}
151=>
#line	981	"limbo.y"
{
		if(yys[yypt-1].yyv.ids.next != nil)
			yyerror("only one identifier allowed in a label");
		yyval.ids = yys[yypt-1].yyv.ids;
	}
152=>
#line	989	"limbo.y"
{
		yyval.ids = nil;
	}
153=>
#line	993	"limbo.y"
{
		yyval.ids = mkids(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval, nil, nil);
	}
154=>
#line	999	"limbo.y"
{
		yys[yypt-1].yyv.node.left.right.right = yys[yypt-0].yyv.node;
		yyval.node = yys[yypt-1].yyv.node;
	}
155=>
#line	1006	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkscope(mkunary(Olabel, rotater(yys[yypt-1].yyv.node))));
	}
156=>
#line	1010	"limbo.y"
{
		yys[yypt-3].yyv.node.left.right.right = yys[yypt-2].yyv.node;
		yyval.node = mkbin(Oseq, mkscope(mkunary(Olabel, rotater(yys[yypt-1].yyv.node))), yys[yypt-3].yyv.node);
	}
157=>
#line	1017	"limbo.y"
{
		yys[yypt-1].yyv.node.left.right = mkscope(yys[yypt-0].yyv.node);
		yyval.node = yys[yypt-1].yyv.node;
	}
158=>
#line	1024	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)));
	}
159=>
#line	1028	"limbo.y"
{
		yys[yypt-3].yyv.node.left.right = mkscope(yys[yypt-2].yyv.node);
		yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)), yys[yypt-3].yyv.node);
	}
160=>
#line	1035	"limbo.y"
{
		yys[yypt-1].yyv.node.left.right = mkscope(yys[yypt-0].yyv.node);
		yyval.node = yys[yypt-1].yyv.node;
	}
161=>
#line	1042	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)));
	}
162=>
#line	1046	"limbo.y"
{
		yys[yypt-3].yyv.node.left.right = mkscope(yys[yypt-2].yyv.node);
		yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)), yys[yypt-3].yyv.node);
	}
163=>
yyval.node = yys[yyp+1].yyv.node;
164=>
#line	1054	"limbo.y"
{
		yyval.node = mkbin(Orange, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
165=>
#line	1058	"limbo.y"
{
		yyval.node = mkn(Owild, nil, nil);
		yyval.node.src = yys[yypt-0].yyv.tok.src;
	}
166=>
#line	1063	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
167=>
#line	1067	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
168=>
#line	1075	"limbo.y"
{
		yys[yypt-1].yyv.node.left.right = mkscope(yys[yypt-0].yyv.node);
		yyval.node = yys[yypt-1].yyv.node;
	}
169=>
#line	1082	"limbo.y"
{
		yyval.node = mkunary(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)));
	}
170=>
#line	1086	"limbo.y"
{
		yys[yypt-3].yyv.node.left.right = mkscope(yys[yypt-2].yyv.node);
		yyval.node = mkbin(Oseq, mkunary(Olabel, rotater(yys[yypt-1].yyv.node)), yys[yypt-3].yyv.node);
	}
171=>
#line	1093	"limbo.y"
{
		yyval.node = mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
	}
172=>
#line	1097	"limbo.y"
{
		yyval.node = mkn(Owild, nil, nil);
		yyval.node.src = yys[yypt-0].yyv.tok.src;
	}
173=>
#line	1102	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
174=>
#line	1106	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
175=>
#line	1114	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = curline();
		yyval.node.src.stop = yyval.node.src.start;
	}
176=>
yyval.node = yys[yyp+1].yyv.node;
177=>
yyval.node = yys[yyp+1].yyv.node;
178=>
#line	1124	"limbo.y"
{
		yyval.node = mkbin(Oas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
179=>
#line	1128	"limbo.y"
{
		yyval.node = mkbin(Oandas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
180=>
#line	1132	"limbo.y"
{
		yyval.node = mkbin(Ooras, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
181=>
#line	1136	"limbo.y"
{
		yyval.node = mkbin(Oxoras, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
182=>
#line	1140	"limbo.y"
{
		yyval.node = mkbin(Olshas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
183=>
#line	1144	"limbo.y"
{
		yyval.node = mkbin(Orshas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
184=>
#line	1148	"limbo.y"
{
		yyval.node = mkbin(Oaddas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
185=>
#line	1152	"limbo.y"
{
		yyval.node = mkbin(Osubas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
186=>
#line	1156	"limbo.y"
{
		yyval.node = mkbin(Omulas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
187=>
#line	1160	"limbo.y"
{
		yyval.node = mkbin(Odivas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
188=>
#line	1164	"limbo.y"
{
		yyval.node = mkbin(Omodas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
189=>
#line	1168	"limbo.y"
{
		yyval.node = mkbin(Oexpas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
190=>
#line	1172	"limbo.y"
{
		yyval.node = mkbin(Osnd, yys[yypt-3].yyv.node, yys[yypt-0].yyv.node);
	}
191=>
#line	1176	"limbo.y"
{
		yyval.node = mkbin(Osnd, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
192=>
#line	1180	"limbo.y"
{
		yyval.node = mkbin(Odas, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
193=>
#line	1184	"limbo.y"
{
		yyval.node = mkn(Oload, yys[yypt-0].yyv.node, nil);
		yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.node.src.stop;
		yyval.node.ty = mkidtype(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval);
	}
194=>
#line	1191	"limbo.y"
{
		yyval.node = yyval.node = mkbin(Oexp, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
195=>
#line	1195	"limbo.y"
{
		yyval.node = mkbin(Omul, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
196=>
#line	1199	"limbo.y"
{
		yyval.node = mkbin(Odiv, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
197=>
#line	1203	"limbo.y"
{
		yyval.node = mkbin(Omod, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
198=>
#line	1207	"limbo.y"
{
		yyval.node = mkbin(Oadd, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
199=>
#line	1211	"limbo.y"
{
		yyval.node = mkbin(Osub, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
200=>
#line	1215	"limbo.y"
{
		yyval.node = mkbin(Orsh, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
201=>
#line	1219	"limbo.y"
{
		yyval.node = mkbin(Olsh, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
202=>
#line	1223	"limbo.y"
{
		yyval.node = mkbin(Olt, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
203=>
#line	1227	"limbo.y"
{
		yyval.node = mkbin(Ogt, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
204=>
#line	1231	"limbo.y"
{
		yyval.node = mkbin(Oleq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
205=>
#line	1235	"limbo.y"
{
		yyval.node = mkbin(Ogeq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
206=>
#line	1239	"limbo.y"
{
		yyval.node = mkbin(Oeq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
207=>
#line	1243	"limbo.y"
{
		yyval.node = mkbin(Oneq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
208=>
#line	1247	"limbo.y"
{
		yyval.node = mkbin(Oand, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
209=>
#line	1251	"limbo.y"
{
		yyval.node = mkbin(Oxor, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
210=>
#line	1255	"limbo.y"
{
		yyval.node = mkbin(Oor, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
211=>
#line	1259	"limbo.y"
{
		yyval.node = mkbin(Ocons, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
212=>
#line	1263	"limbo.y"
{
		yyval.node = mkbin(Oandand, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
213=>
#line	1267	"limbo.y"
{
		yyval.node = mkbin(Ooror, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
214=>
yyval.node = yys[yyp+1].yyv.node;
215=>
#line	1274	"limbo.y"
{
		yys[yypt-0].yyv.node.src.start = yys[yypt-1].yyv.tok.src.start;
		yyval.node = yys[yypt-0].yyv.node;
	}
216=>
#line	1279	"limbo.y"
{
		yyval.node = mkunary(Oneg, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
217=>
#line	1284	"limbo.y"
{
		yyval.node = mkunary(Onot, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
218=>
#line	1289	"limbo.y"
{
		yyval.node = mkunary(Ocomp, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
219=>
#line	1294	"limbo.y"
{
		yyval.node = mkunary(Oind, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
220=>
#line	1299	"limbo.y"
{
		yyval.node = mkunary(Opreinc, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
221=>
#line	1304	"limbo.y"
{
		yyval.node = mkunary(Opredec, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
222=>
#line	1309	"limbo.y"
{
		yyval.node = mkunary(Orcv, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
223=>
#line	1314	"limbo.y"
{
		yyval.node = mkunary(Ohd, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
224=>
#line	1319	"limbo.y"
{
		yyval.node = mkunary(Otl, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
225=>
#line	1324	"limbo.y"
{
		yyval.node = mkunary(Olen, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
226=>
#line	1329	"limbo.y"
{
		yyval.node = mkunary(Oref, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
227=>
#line	1334	"limbo.y"
{
		yyval.node = mkunary(Otagof, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
	}
228=>
#line	1339	"limbo.y"
{
		yyval.node = mkn(Oarray, yys[yypt-3].yyv.node, nil);
		yyval.node.ty = mktype(yys[yypt-5].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tarray, yys[yypt-0].yyv.ty, nil);
		yyval.node.src = yyval.node.ty.src;
	}
229=>
#line	1345	"limbo.y"
{
		yyval.node = mkn(Oarray, yys[yypt-5].yyv.node, yys[yypt-1].yyv.node);
		yyval.node.src.start = yys[yypt-7].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
230=>
#line	1351	"limbo.y"
{
		yyval.node = mkn(Onothing, nil, nil);
		yyval.node.src.start = yys[yypt-5].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-4].yyv.tok.src.stop;
		yyval.node = mkn(Oarray, yyval.node, yys[yypt-1].yyv.node);
		yyval.node.src.start = yys[yypt-6].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
231=>
#line	1360	"limbo.y"
{
		yyval.node = etolist(yys[yypt-1].yyv.node);
		yyval.node.src.start = yys[yypt-4].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
232=>
#line	1366	"limbo.y"
{
		yyval.node = mkn(Ochan, nil, nil);
		yyval.node.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tchan, yys[yypt-0].yyv.ty, nil);
		yyval.node.src = yyval.node.ty.src;
	}
233=>
#line	1372	"limbo.y"
{
		yyval.node = mkn(Ochan, yys[yypt-3].yyv.node, nil);
		yyval.node.ty = mktype(yys[yypt-5].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tchan, yys[yypt-0].yyv.ty, nil);
		yyval.node.src = yyval.node.ty.src;
	}
234=>
#line	1378	"limbo.y"
{
		yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
		yyval.node.ty = mktype(yys[yypt-3].yyv.tok.src.start, yys[yypt-0].yyv.node.src.stop, Tarray, mkidtype(yys[yypt-1].yyv.tok.src, yys[yypt-1].yyv.tok.v.idval), nil);
		yyval.node.src = yyval.node.ty.src;
	}
235=>
#line	1384	"limbo.y"
{
		yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
		yyval.node.ty = mkidtype(yyval.node.src, yys[yypt-1].yyv.tok.v.idval);
	}
236=>
#line	1390	"limbo.y"
{
		yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
		yyval.node.ty = mkidtype(yyval.node.src, yys[yypt-1].yyv.tok.v.idval);
	}
237=>
#line	1396	"limbo.y"
{
		yyval.node = mkunary(Ocast, yys[yypt-0].yyv.node);
		yyval.node.src.start = yys[yypt-1].yyv.tok.src.start;
		yyval.node.ty = yys[yypt-1].yyv.ty;
	}
238=>
yyval.node = yys[yyp+1].yyv.node;
239=>
#line	1405	"limbo.y"
{
		yyval.node = mkn(Ocall, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
		yyval.node.src.start = yys[yypt-3].yyv.node.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
240=>
#line	1411	"limbo.y"
{
		yyval.node = yys[yypt-1].yyv.node;
		if(yys[yypt-1].yyv.node.op == Oseq)
			yyval.node = mkn(Otuple, rotater(yys[yypt-1].yyv.node), nil);
		else
			yyval.node.flags |= byte PARENS;
		yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
241=>
#line	1421	"limbo.y"
{
#		n := mkdeclname($1, mkids($1, enter(".fn"+string nfnexp++, 0), nil, nil));
#		$<node>$ = fndef(n, $2);
#		nfns++;
	}
242=>
#line	1426	"limbo.y"
{
#		$$ = fnfinishdef($<node>3, $4);
#		$$ = mkdeclname($1, $$.left.decl);
		yyerror("urt unk");
		yyval.node = nil;
	}
243=>
#line	1433	"limbo.y"
{
		yyval.node = mkbin(Odot, yys[yypt-2].yyv.node, mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval));
	}
244=>
#line	1437	"limbo.y"
{
		yyval.node = mkbin(Omdot, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
245=>
#line	1441	"limbo.y"
{
		yyval.node = mkbin(Oindex, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node);
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
246=>
#line	1446	"limbo.y"
{
		if(yys[yypt-3].yyv.node.op == Onothing)
			yys[yypt-3].yyv.node.src = yys[yypt-2].yyv.tok.src;
		if(yys[yypt-1].yyv.node.op == Onothing)
			yys[yypt-1].yyv.node.src = yys[yypt-2].yyv.tok.src;
		yyval.node = mkbin(Oslice, yys[yypt-5].yyv.node, mkbin(Oseq, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node));
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
247=>
#line	1455	"limbo.y"
{
		yyval.node = mkunary(Oinc, yys[yypt-1].yyv.node);
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
248=>
#line	1460	"limbo.y"
{
		yyval.node = mkunary(Odec, yys[yypt-1].yyv.node);
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
249=>
#line	1465	"limbo.y"
{
		yyval.node = mksconst(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
	}
250=>
#line	1469	"limbo.y"
{
		yyval.node = mkconst(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.ival);
		if(yys[yypt-0].yyv.tok.v.ival > big 16r7fffffff || yys[yypt-0].yyv.tok.v.ival < big -16r7fffffff)
			yyval.node.ty = tbig;
	}
251=>
#line	1475	"limbo.y"
{
		yyval.node = mkrconst(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.rval);
	}
252=>
#line	1479	"limbo.y"
{
		yyval.node = mkbin(Oindex, yys[yypt-5].yyv.node, rotater(mkbin(Oseq, yys[yypt-3].yyv.node, yys[yypt-1].yyv.node)));
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
253=>
#line	1486	"limbo.y"
{
		yyval.node = mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
	}
254=>
#line	1490	"limbo.y"
{
		yyval.node = mknil(yys[yypt-0].yyv.tok.src);
	}
255=>
#line	1496	"limbo.y"
{
		yyval.node = mkn(Otuple, rotater(yys[yypt-1].yyv.node), nil);
		yyval.node.src.start = yys[yypt-2].yyv.tok.src.start;
		yyval.node.src.stop = yys[yypt-0].yyv.tok.src.stop;
	}
256=>
yyval.node = yys[yyp+1].yyv.node;
257=>
#line	1505	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
258=>
yyval.node = yys[yyp+1].yyv.node;
259=>
yyval.node = yys[yyp+1].yyv.node;
260=>
#line	1515	"limbo.y"
{
		yyval.node = mkn(Otype, nil, nil);
		yyval.node.ty = mkidtype(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
		yyval.node.src = yyval.node.ty.src;
	}
261=>
#line	1521	"limbo.y"
{
		yyval.node = mkn(Otype, nil, nil);
		yyval.node.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tarray, yys[yypt-0].yyv.ty, nil);
		yyval.node.src = yyval.node.ty.src;
	}
262=>
#line	1527	"limbo.y"
{
		yyval.node = mkn(Otype, nil, nil);
		yyval.node.ty = mktype(yys[yypt-2].yyv.tok.src.start, yys[yypt-0].yyv.ty.src.stop, Tlist, yys[yypt-0].yyv.ty, nil);
		yyval.node.src = yyval.node.ty.src;
	}
263=>
#line	1533	"limbo.y"
{
		yyval.node = mkn(Otype, nil ,nil);
		yyval.node.ty = yys[yypt-0].yyv.ty;
		yyval.node.ty.flags |= CYCLIC;
		yyval.node.src = yyval.node.ty.src;
	}
264=>
#line	1542	"limbo.y"
{
		yyval.node = mkname(yys[yypt-0].yyv.tok.src, yys[yypt-0].yyv.tok.v.idval);
	}
265=>
#line	1546	"limbo.y"
{
		yyval.node = nil;
	}
266=>
yyval.node = yys[yyp+1].yyv.node;
267=>
yyval.node = yys[yyp+1].yyv.node;
268=>
#line	1554	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
269=>
#line	1558	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
270=>
#line	1564	"limbo.y"
{
		yyval.node = nil;
	}
271=>
#line	1568	"limbo.y"
{
		yyval.node = rotater(yys[yypt-0].yyv.node);
	}
272=>
yyval.node = yys[yyp+1].yyv.node;
273=>
yyval.node = yys[yyp+1].yyv.node;
274=>
yyval.node = yys[yyp+1].yyv.node;
275=>
#line	1579	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
276=>
#line	1585	"limbo.y"
{
		yyval.node = rotater(yys[yypt-0].yyv.node);
	}
277=>
#line	1589	"limbo.y"
{
		yyval.node = rotater(yys[yypt-1].yyv.node);
	}
278=>
yyval.node = yys[yyp+1].yyv.node;
279=>
#line	1596	"limbo.y"
{
		yyval.node = mkbin(Oseq, yys[yypt-2].yyv.node, yys[yypt-0].yyv.node);
	}
280=>
#line	1602	"limbo.y"
{
		yyval.node = mkn(Oelem, nil, yys[yypt-0].yyv.node);
		yyval.node.src = yys[yypt-0].yyv.node.src;
	}
281=>
#line	1607	"limbo.y"
{
		yyval.node = mkbin(Oelem, rotater(yys[yypt-2].yyv.node), yys[yypt-0].yyv.node);
	}
282=>
#line	1613	"limbo.y"
{
		if(yys[yypt-1].yyv.node.op == Oseq)
			yys[yypt-1].yyv.node.right.left = rotater(yys[yypt-0].yyv.node);
		else
			yys[yypt-1].yyv.node.left = rotater(yys[yypt-0].yyv.node);
		yyval.node = yys[yypt-1].yyv.node;
	}
283=>
#line	1623	"limbo.y"
{
		yyval.node = typedecl(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-0].yyv.tok.src.stop, Tpoly, nil, nil));
	}
284=>
#line	1627	"limbo.y"
{
		if(yys[yypt-3].yyv.node.op == Oseq)
			yys[yypt-3].yyv.node.right.left = rotater(yys[yypt-2].yyv.node);
		else
			yys[yypt-3].yyv.node.left = rotater(yys[yypt-2].yyv.node);
		yyval.node = mkbin(Oseq, yys[yypt-3].yyv.node, typedecl(yys[yypt-1].yyv.ids, mktype(yys[yypt-1].yyv.ids.src.start, yys[yypt-0].yyv.tok.src.stop, Tpoly, nil, nil)));
	}
		}
	}

	return yyn;
}
